home *** CD-ROM | disk | FTP | other *** search
- #
- # Global demo objects attributes
- #
-
- srfMainColor = white;
- srfDomainColor = red;
- srfCurveColor = yellow;
- srfUparColor = magenta;
- srfVparColor = green;
- srfNormColor = cyan;
- srfCrvtrColor = blue;
- crvTangColor = yellow; # tangent
- crvNormColor = red; # normal
- crvGCrvtrColor = cyan; # geodesic osculating circle
- crvNCrvtrColor = blue; # normal osculating circle
-
- showSurfMain = true;
- showSurfDomain = true;
- showSurfHodo = true;
- showSurfDerivAtPoint = true;
- showSurfDerivAtHodo = true;
- showSurfCrvtr = true;
- showCurvDeriv = true;
- showCurvCrvtr = true;
-
- hodoMat_ = sc(0.5) * trans(vector(0, 0, 2));
-
- #
- # Implementation functions
- #
-
- normalize = FUNCTION(vec):
- return = vec * (1.0 / sqrt(vec*vec));
-
- SurfThumb = FUNCTION(pos):
- return = sphereSrf(0.025)*trans(pos);
-
- SurfOsculCircle = FUNCTION(vec, radius, nvec, dir):
- return = circle(vector(0, 0, 0), radius)*
- rotz2v2(nvec ^ dir, nvec)*
- trans(vec+nvec*radius);
-
- SurfOsculPlane = FUNCTION(vec, size, nvec, dir):
- return = poly(list(
- vector(-size, -size, 0),
- vector(-size, size, 0),
- vector(size, size, 0),
- vector(size, -size, 0)
- ), false):
- return = return * rotz2v2(nvec, dir) * trans(vec);
-
- #
- # Global data used to create and cache demonstration
- #
-
- surface_ = sphereSrf(1);
- dus_ = sphereSrf(1);
- dvs_ = sphereSrf(1);
- ns_ = sphereSrf(1);
- d2us_ = sphereSrf(1);
- d2vs_ = sphereSrf(1);
- duvs_ = sphereSrf(1);
- curve_ = circle(vector(0, 0, 0), 1);
- ccrv_ = circle(vector(0, 0, 0), 1);
- evol_ = circle(vector(0, 0, 0), 1);
- curveDomain_ = list(curve_);
- dusLine_ = curve_;
- dvsLine_ = curve_;
- nsLine_ = curve_;
-
-
- #
- # Demonstration export
- #
-
- ShowSurfHodo = PROCEDURE(hodo, deriv):
- showSurfDerivAtHodo = deriv:
- showSurfHodo = hodo;
-
- ShowSurfGeom = PROCEDURE(showDeriv, showCrvtr):
- showSurfDerivAtPoint = showDeriv:
- showSurfCrvtr = showCrvtr;
-
- ShowCurvGeom = PROCEDURE(showDeriv, showCrvtr):
- showCurvDeriv = showDeriv:
- showCurvCrvtr = showCrvtr;
-
- CreateSurfDemo = PROCEDURE(srf, crv): sqp:
- surface_ = srf:
- dus_ = sderive(srf, ROW):
- dvs_ = sderive(srf, COL):
- ns_ = snrmlsrf(srf):
- d2us_ = sderive(dus_, ROW):
- d2vs_ = sderive(dvs_, COL):
- duvs_ = sderive(dus_, COL):
- curve_ = creparam(coerce(crv, E2), 0, 1):
- ccrv_ = compose(srf, curve_):
- evol_ = creparam(evolute(ccrv_), 0, 1):
- sqp = list(
- vector(0, 0, 0),
- vector(0, 1, 0),
- vector(1, 1, 0),
- vector(1, 0, 0)
- ):
- curveDomain_ = list(curve_, poly(sqp, false), sphereSrf(0.025)) * tz(-1.5):
-
- dusLine_ = compose(dus_, curve_):
- dvsLine_ = compose(dvs_, curve_):
- nsLine_ = compose(ns_, curve_):
-
- color(surface_, srfMainColor):
- color(curveDomain_, srfDomainColor):
- color(ccrv_, srfCurveColor):
- color(dus_, srfUparColor):
- color(dvs_, srfVparColor):
- color(ns_, srfNormColor):
- color(dusLine_, srfCurveColor):
- color(dvsLine_, srfCurveColor):
- color(nsLine_, srfCurveColor);
-
-
- SurfAndHodoScene = FUNCTION():
- return = nil():
- if (showSurfMain, return = return + list(surface_, ccrv_)):
- if (showSurfDomain, return = return + curveDomain_):
- if (showSurfHodo,
- return = return +
- list(dus_, dvs_, ns_, dusLine_, dvsLine_, nsLine_, sphereSrf(0.025))*hodoMat_
- );
-
- #
- # Present curve in the surface geometry
- #
- GeomAtCurvPoint = FUNCTION(pt, t, nvec):
- tang: evpt: radv: cr: cN: svec: Nn: Ns: pos: ncirc: gcirc: tline: nline:
-
- return = nil():
- tang = ctangent(ccrv_, t):
- evpt = ceval(evol_, t):
- pos = coerce(pt, vector_type):
- if (showCurvDeriv,
- tline = pt + pt*trans(tang):
- color(tline, crvTangColor):
- snoc(tline, return):
- nline = pt + evpt: # c(t) + N(t)/k(t)
- color(nline, crvNormColor):
- snoc(nline, return)
- ):
- if (showCurvCrvtr,
- radv = coerce(evpt, vector_type) - pos:
- cr = sqrt(radv*radv): # 1/k(t)
- if (abs(cr) > 1e-4,
- cN = radv * (1 / cr): # normalize N(t)/K(t)
- svec = nvec ^ tang:
- Nn = cN * nvec:
- if (abs(Nn) > 1e-4,
- ncirc = SurfOsculCircle(pos, cr / Nn, nvec, tang):
- color(ncirc, crvNCrvtrColor):
- snoc(ncirc, return)
- ):
- Ns = cN * svec:
- if (abs(Ns) > 1e-4,
- gcirc = SurfOsculCircle(pos, cr / Ns, svec, tang):
- color(gcirc, crvGCrvtrColor):
- snoc(gcirc, return)
- )
- )
- );
-
- GeomAtCurvParam = FUNCTION(t): dompt: nvec:
- dompt = coerce(ceval(curve_, t), E2):
- nvec = coerce(seval(ns_, coord(dompt, 1), coord(dompt, 2)), vector_type):
- return = GeomAtCurvPoint(ceval(ccrv_, t), t, normalize(nvec));
-
- #
- # Present surface geometry along some curve
- #
- GeomAtSurfPoint = FUNCTION(u, v):
- srfpt: thumb: vdus: vdvs: vns: vplan: duspt: dvspt: nspt: nuv: circ1: circ2:
- Aval: Bval: Dval: k1: k2: mk1f: mk2f: lk1e: lk2e: dn1: dn2: dir1: dir2:
- E: F: G: L: N: M: u1: u2: v1: v2: pos: hdvs: hdus: hns:
-
- srfpt = seval(surface_, u, v):
- pos = coerce(srfpt, vector_type):
- duspt = seval(dus_, u, v):
- dvspt = seval(dvs_, u, v):
- nspt = seval(ns_, u, v):
-
- thumb = SurfThumb(pos):
- color(thumb, srfCurveColor):
- return = list(thumb):
-
- if (showSurfDerivAtPoint,
- vdus = srfpt + duspt*trans(pos):
- color(vdus, srfUparColor):
- vdvs = srfpt + dvspt*trans(pos):
- color(vdvs, srfVparColor):
- vns = srfpt + nspt*trans(pos):
- color(vns, srfNormColor):
- vplan = SurfOsculPlane(pos, 0.15, coerce(nspt, vector_type), coerce(duspt, vector_type)):
- color(vplan, srfNormColor):
- return = return + list(vdus, vdvs, vns, vplan)
- ):
- if (showSurfDerivAtHodo,
- hdus = ctlpt(E3, 0, 0, 0) + duspt:
- color(hdus, srfMainColor):
- hdvs = ctlpt(E3, 0, 0, 0) + dvspt:
- color(hdvs, srfMainColor):
- hns = ctlpt(E3, 0, 0, 0) + nspt:
- color(hns, srfMainColor):
- return = return + list(hdus, hdvs, hns)*hodoMat_
- ):
-
- if (showSurfCrvtr,
- duspt = coerce(duspt, vector_type):
- dvspt = coerce(dvspt, vector_type):
- nuv = normalize(coerce(nspt, vector_type)):
- E = duspt*duspt:
- F = duspt*dvspt:
- G = dvspt*dvspt:
- L = coerce(seval(d2us_, u, v), vector_type) * nuv:
- M = coerce(seval(duvs_, u, v), vector_type) * nuv:
- N = coerce(seval(d2vs_, u, v), vector_type) * nuv:
- Aval = (E*G - F*F):
- Bval = (G*L + E*N - 2*F*M) / (2*Aval):
- Dval = sqrt(Bval*Bval - (L*N - M*M)/Aval):
- k1 = Bval - Dval:
- k2 = Bval + Dval:
- mk1f = M - k1*F:
- mk2f = M - k2*F:
- lk1e = L - k1*E:
- lk2e = L - k2*E:
- dn1 = sqrt(mk1f*mk1f + lk1e*lk1e):
- dn2 = sqrt(mk2f*mk2f + lk2e*lk2e):
- if ((abs(dn1) > 1e-4),
- u1 = mk1f / dn1: v1 = -lk1e / dn1,
- if (abs(lk1e) < 1e-6, u1 = 1: v1 = 0, u1 = 0: v1 = 1)
- ):
- if ((abs(dn2) > 1e-4),
- u2 = mk2f / dn2: v2 = -lk2e / dn2,
- if (abs(lk2e) < 1e-6, u2 = 1: v2 = 0, u2 = 0: v2 = 1)
- ):
- dir1 = duspt*u1 + dvspt*v1:
- dir2 = duspt*u2 + dvspt*v2:
- if (abs(dir1*dir2) > 1e-4,
- printf("At point %f %f \\n", list(u, v)):
- printf("M: %f F: %f L: %f E: %f\\n", list(M, F, L, E)):
- printf("mk1f: %f mk2f: %f lk1e: %f lk2e: %f\\n", list(mk1f, mk2f, lk1e, lk2e)):
- printf("u1: %f v1: %f u2: %f v2: %f\\n", list(u1, v1, u2, v2))
- ):
-
- if (abs(k1) > 1e-4,
- circ1 = SurfOsculCircle(pos, 1/k1, nuv, dir1):
- color(circ1, srfCrvtrColor):
- snoc(circ1, return)
- ):
- if (abs(k2) > 1e-4,
- circ2 = SurfOsculCircle(pos, 1/k2, nuv, dir2):
- color(circ2, srfCrvtrColor):
- snoc(circ2, return)
- )
- );
-
-
- GeomAtParam = FUNCTION(t): dompt:
- dompt = coerce(ceval(curve_, t), E2):
- return = GeomAtSurfPoint(coord(dompt, 1), coord(dompt, 2));
-